package com.qianying.service.impl;

import com.qianying.comment.CommonResult;
import com.qianying.service.FileUploadService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 文件上传Service实现类
 * 修复导入问题，完整实现跨系统文件上传
 */
@Service
public class FileUploadServiceImpl implements FileUploadService {

    // Windows系统上传目录
    @Value("${file.upload.win-base-dir}")
    private String winBaseDir;

    // CentOS系统上传目录
    @Value("${file.upload.centos-base-dir}")
    private String centosBaseDir;

    // 访问基础URL

    private String baseAccessUrl;

    @Value("${file.access.win-base-url}")
    private String winBaseAccessUrl;
    @Value("${file.access.centos-base-url}")
    private String centOsBaseAccessUrl;

    // 当前系统的基础上传目录
    private String baseUploadDir;

    // 当前系统类型
    private String systemType;

    /**
     * 初始化时检测操作系统类型并选择对应的上传目录
     */
    public void init() {
        // 检测当前操作系统
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("win")) {
            systemType = "Windows";
            baseUploadDir = winBaseDir;
            baseAccessUrl = winBaseAccessUrl;
        } else {
            systemType = "CentOS";
            baseUploadDir = centosBaseDir;
            baseAccessUrl = centOsBaseAccessUrl;
        }

        // 确保上传目录存在
        createUploadDir();
    }

    /**
     * 创建上传目录
     */
    private void createUploadDir() {
        if (StringUtils.hasText(baseUploadDir)) {
            File dir = new File(formatFilePath(baseUploadDir));
            if (!dir.exists()) {
                dir.mkdirs();
            }
        }
    }

    /**
     * 格式化文件路径，适配不同系统的路径分隔符
     */
    private String formatFilePath(String path) {
        if (systemType.contains("Windows")) {
            return path.replace("/", "\\");
        } else {
            return path.replace("\\", "/");
        }
    }

    @Override
    public CommonResult<Map<String, String>> uploadFile(MultipartFile file) {
        // 初始化系统配置（确保在首次调用时完成初始化）
        if (baseUploadDir == null) {
            init();
        }

        // 校验文件
        if (file.isEmpty()) {
            return CommonResult.failed("上传文件不能为空");
        }

        try {
            // 获取文件信息
            String originalFileName = file.getOriginalFilename();
            String fileExt = originalFileName.substring(originalFileName.lastIndexOf("."));

            // 构建日期目录
            String dateDir = new SimpleDateFormat("yyyyMMdd").format(new Date());

            // 构建保存路径
            String saveDir = baseUploadDir + dateDir + File.separator;
            saveDir = formatFilePath(saveDir);

            // 创建目录
            File dir = new File(saveDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 生成唯一文件名
            String uniqueFileName = UUID.randomUUID().toString() + fileExt;
            String filePath = saveDir + uniqueFileName;

            // 保存文件
            file.transferTo(new File(filePath));

            // 构建访问路径
            String accessPath = baseAccessUrl + dateDir + "/" + uniqueFileName;

            // 整理返回结果
            Map<String, String> result = new HashMap<>();
            result.put("originalFileName", originalFileName);
            result.put("filePath", filePath);
            result.put("accessPath", accessPath);
            result.put("systemType", systemType);

            return CommonResult.success(result, "文件上传成功");

        } catch (IOException e) {
            return CommonResult.failed("文件上传失败：" + e.getMessage());
        }
    }

    @Override
    public CommonResult<?> deleteFile(String filePath) {
        if (!StringUtils.hasText(filePath)) {
            return CommonResult.failed("文件路径不能为空");
        }

        try {
            Path path = Paths.get(formatFilePath(filePath));
            if (Files.exists(path)) {
                Files.delete(path);
                return CommonResult.success("文件删除成功");
            } else {
                return CommonResult.failed("文件不存在");
            }
        } catch (IOException e) {
            return CommonResult.failed("文件删除失败：" + e.getMessage());
        }
    }
}